package jwt

import (
	"crypto/rand"
	"encoding/hex"
	"time"

	"github.com/gogf/gf/v2/crypto/gmd5"
	"github.com/gogf/gf/v2/errors/gerror"
	"github.com/gogf/gf/v2/os/gtime"
	"github.com/gogf/gf/v2/util/gconv"
)

// TokenInfo 令牌信息
type TokenInfo struct {
	UserId    int    `json:"user_id"`
	Username  string `json:"username"`
	Role      string `json:"role"`
	TokenType string `json:"token_type"`
}

// GenerateToken 生成访问令牌
func GenerateToken(userId int, username, role string) (string, error) {
	// 生成随机字符串
	randomBytes := make([]byte, 16)
	if _, err := rand.Read(randomBytes); err != nil {
		return "", gerror.Wrap(err, "生成随机令牌失败")
	}
	
	// 组合令牌内容: userId + username + role + timestamp + random
	content := gconv.String(userId) + username + role + gconv.String(gtime.Now().Unix()) + hex.EncodeToString(randomBytes)
	
	// 使用MD5加密生成最终令牌
	token := gmd5.MustEncrypt(content)
	
	return token, nil
}

// GenerateRefreshToken 生成刷新令牌
func GenerateRefreshToken(userId int, username string) (string, error) {
	// 生成随机字符串
	randomBytes := make([]byte, 32)
	if _, err := rand.Read(randomBytes); err != nil {
		return "", gerror.Wrap(err, "生成随机令牌失败")
	}
	
	// 组合刷新令牌内容: userId + username + timestamp + random + refresh
	content := gconv.String(userId) + username + gconv.String(gtime.Now().Unix()) + hex.EncodeToString(randomBytes) + "refresh"
	
	// 使用MD5加密生成最终令牌
	token := gmd5.MustEncrypt(content)
	
	return token, nil
}

// GetTokenExpireTime 获取访问令牌过期时间（2小时）
func GetTokenExpireTime() *gtime.Time {
	return gtime.Now().Add(2 * time.Hour)
}

// GetRefreshTokenExpireTime 获取刷新令牌过期时间（7天）
func GetRefreshTokenExpireTime() *gtime.Time {
	return gtime.Now().Add(7 * 24 * time.Hour)
}

// ValidateTokenFormat 验证令牌格式
func ValidateTokenFormat(token string) error {
	if token == "" {
		return gerror.New("令牌不能为空")
	}
	
	if len(token) != 32 {
		return gerror.New("令牌格式不正确")
	}
	
	return nil
}